Packages utiles

Comme vu dans l'introduction JULIA possède une bibliothèque de package assez grande dont il n'est pas forcément aisé d'en faire le tri...

Je vous propose ici la description et utilisation de quelques classiques

En premier lieu un packages graphiques :

  • Plots
  • avec des backend Gr, PyPlot, Plotly

et deux packages plus "statistiques" :

  • DataFrames
  • Rdatasets

Graphiques

La gestion graphique ne fait pas partie intégrante de JULIA il faut faire appel à des packages extérieurs et plusieurs choix sont possibles. En voici quelques uns

Plots

Plots est basé sur une bibliothèque éprouvée MatPlotLib (en Python). Sa syntaxe est identique à celle de MATLAB


In [ ]:
(v1.1) pkg> add Plots
(v1.1) pkg> add PlotlyJS
(v1.1) pkg> add PyPlot

In [43]:
using Plots

In [44]:
x=range(0,stop=1,length=3000);
plot(x,sin.(10*x))


Out[44]:
0.00 0.25 0.50 0.75 1.00 -1.0 -0.5 0.0 0.5 1.0 y1

In [49]:
x=range(0,stop=1,length=3000);
plot(x,sin.(10*x))
plot!(x,cos.(10*x))


Out[49]:
0.00 0.25 0.50 0.75 1.00 -1.0 -0.5 0.0 0.5 1.0 y1 y2

In [52]:
subplot(2,1,1)
plot(x,sin.(x),"g",linewidth=2.0)
subplot(2,1,2)
plot(x,x,"r")
grid(true)
title("tracé 2")


UndefVarError: subplot not defined

Stacktrace:
 [1] top-level scope at In[52]:1

In [51]:
n=1024
X=randn(n)
Y=randn(n)
scatter(X,Y)


Out[51]:
-2 0 2 4 -3 -2 -1 0 1 2 3 y1

In [5]:
X=rand(5)
Y=-rand(5)
bar(1:5,X,facecolor="#9999ff", edgecolor="white")
bar(1:5,Y,facecolor="#ff9999", edgecolor="white")
for i=1:5
    txt=string(X[i])
    text(i+0.1,X[i]+0.01,txt[1:7])
    txt=string(Y[i])
    text(i+0.1,Y[i]-0.08,txt[1:7])
end
ylim(-1.2,1.2)


Unknown key: edgecolor

Stacktrace:
 [1] default(::Symbol) at /Users/thierryclopeau/.julia/v0.6/Plots/src/args.jl:609
 [2] warnOnUnsupported_args(::Plots.GRBackend, ::Dict{Symbol,Any}) at /Users/thierryclopeau/.julia/v0.6/Plots/src/args.jl:1079
 [3] _add_the_series(::Plots.Plot{Plots.GRBackend}, ::Plots.Subplot{Plots.GRBackend}, ::Dict{Symbol,Any}) at /Users/thierryclopeau/.julia/v0.6/Plots/src/pipeline.jl:374
 [4] _process_seriesrecipe(::Plots.Plot{Plots.GRBackend}, ::Dict{Symbol,Any}) at /Users/thierryclopeau/.julia/v0.6/Plots/src/pipeline.jl:402
 [5] _process_seriesrecipe(::Plots.Plot{Plots.GRBackend}, ::Dict{Symbol,Any}) at /Users/thierryclopeau/.julia/v0.6/Plots/src/pipeline.jl:415
 [6] _plot!(::Plots.Plot{Plots.GRBackend}, ::Dict{Symbol,Any}, ::Tuple{UnitRange{Int64},Array{Float64,1}}) at /Users/thierryclopeau/.julia/v0.6/Plots/src/plot.jl:235
 [7] #plot#212(::Array{Any,1}, ::Function, ::UnitRange{Int64}, ::Vararg{Any,N} where N) at /Users/thierryclopeau/.julia/v0.6/Plots/src/plot.jl:58
 [8] (::RecipesBase.#kw##plot)(::Array{Any,1}, ::RecipesBase.#plot, ::UnitRange{Int64}, ::Array{Float64,1}, ::Vararg{Array{Float64,1},N} where N) at ./<missing>:0
 [9] #bar#716(::Array{Any,1}, ::Function, ::UnitRange{Int64}, ::Vararg{Any,N} where N) at /Users/thierryclopeau/.julia/v0.6/RecipesBase/src/RecipesBase.jl:385
 [10] (::Plots.#kw##bar)(::Array{Any,1}, ::Plots.#bar, ::UnitRange{Int64}, ::Vararg{Any,N} where N) at ./<missing>:0
 [11] include_string(::String, ::String) at ./loading.jl:522
 [12] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /Users/thierryclopeau/.julia/v0.6/IJulia/src/execute_request.jl:193
 [13] (::Compat.#inner#6{Array{Any,1},IJulia.#execute_request,Tuple{ZMQ.Socket,IJulia.Msg}})() at /Users/thierryclopeau/.julia/v0.6/Compat/src/Compat.jl:189
 [14] eventloop(::ZMQ.Socket) at /Users/thierryclopeau/.julia/v0.6/IJulia/src/eventloop.jl:8
 [15] (::IJulia.##13#16)() at ./task.jl:335

In [6]:
z=rand(20)
pie(z);

In [7]:
contour(rand(50,50))
colorbar()


UndefVarError: colorbar not defined

Stacktrace:
 [1] include_string(::String, ::String) at ./loading.jl:522
 [2] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /Users/thierryclopeau/.julia/v0.6/IJulia/src/execute_request.jl:193
 [3] (::Compat.#inner#6{Array{Any,1},IJulia.#execute_request,Tuple{ZMQ.Socket,IJulia.Msg}})() at /Users/thierryclopeau/.julia/v0.6/Compat/src/Compat.jl:189
 [4] eventloop(::ZMQ.Socket) at /Users/thierryclopeau/.julia/v0.6/IJulia/src/eventloop.jl:8
 [5] (::IJulia.##13#16)() at ./task.jl:335

In [8]:
surf(rand(50,50))


UndefVarError: surf not defined

Stacktrace:
 [1] include_string(::String, ::String) at ./loading.jl:522
 [2] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /Users/thierryclopeau/.julia/v0.6/IJulia/src/execute_request.jl:193
 [3] (::Compat.#inner#6{Array{Any,1},IJulia.#execute_request,Tuple{ZMQ.Socket,IJulia.Msg}})() at /Users/thierryclopeau/.julia/v0.6/Compat/src/Compat.jl:189
 [4] eventloop(::ZMQ.Socket) at /Users/thierryclopeau/.julia/v0.6/IJulia/src/eventloop.jl:8
 [5] (::IJulia.##13#16)() at ./task.jl:335

In [9]:
X=[x for x=-1:0.2:1, y=-1:0.2:1]
Y=[y for x=-1:0.2:1, y=-1:0.2:1]
quiver(-1:0.2:1,-1:0.2:1,X,Y)


Couldn't process recipe args: (StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, Array{Float64,2}, Array{Float64,2})

Stacktrace:
 [1] macro expansion at /Users/thierryclopeau/.julia/v0.6/Plots/src/series.jl:266 [inlined]
 [2] apply_recipe(::Dict{Symbol,Any}, ::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::Array{Float64,2}, ::Array{Float64,2}) at /Users/thierryclopeau/.julia/v0.6/RecipesBase/src/RecipesBase.jl:291
 [3] _process_userrecipes(::Plots.Plot{Plots.GRBackend}, ::Dict{Symbol,Any}, ::Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2},Array{Float64,2}}) at /Users/thierryclopeau/.julia/v0.6/Plots/src/pipeline.jl:81
 [4] _plot!(::Plots.Plot{Plots.GRBackend}, ::Dict{Symbol,Any}, ::Tuple{StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}},Array{Float64,2},Array{Float64,2}}) at /Users/thierryclopeau/.julia/v0.6/Plots/src/plot.jl:179
 [5] #plot#212(::Array{Any,1}, ::Function, ::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::Vararg{Any,N} where N) at /Users/thierryclopeau/.julia/v0.6/Plots/src/plot.jl:58
 [6] (::RecipesBase.#kw##plot)(::Array{Any,1}, ::RecipesBase.#plot, ::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::Vararg{Any,N} where N) at ./<missing>:0
 [7] #quiver#768(::Array{Any,1}, ::Function, ::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::Vararg{Any,N} where N) at /Users/thierryclopeau/.julia/v0.6/RecipesBase/src/RecipesBase.jl:385
 [8] quiver(::StepRangeLen{Float64,Base.TwicePrecision{Float64},Base.TwicePrecision{Float64}}, ::Vararg{Any,N} where N) at /Users/thierryclopeau/.julia/v0.6/RecipesBase/src/RecipesBase.jl:385
 [9] include_string(::String, ::String) at ./loading.jl:522
 [10] execute_request(::ZMQ.Socket, ::IJulia.Msg) at /Users/thierryclopeau/.julia/v0.6/IJulia/src/execute_request.jl:193
 [11] (::Compat.#inner#6{Array{Any,1},IJulia.#execute_request,Tuple{ZMQ.Socket,IJulia.Msg}})() at /Users/thierryclopeau/.julia/v0.6/Compat/src/Compat.jl:189
 [12] eventloop(::ZMQ.Socket) at /Users/thierryclopeau/.julia/v0.6/IJulia/src/eventloop.jl:8
 [13] (::IJulia.##13#16)() at ./task.jl:335

D'autres packages sont disponible Gadfly, Winston, AsciiPlot, GLVisualize...

Type DataFrames

But : travailler avec des tables de données. Ce sont des tables dont les colonnes sont des DataArray. Voici deux façons de construire des DataFrames :


In [28]:
using DataFrames

In [29]:
df = DataFrame(A = 1:4, B = ["M", "F", "F", "M"])


Out[29]:

4 rows × 2 columns

AB
Int64String
11M
22F
33F
44M

In [30]:
df = DataFrame()
df[:A] = 1:8;
df[:B] = ["M", "F", "F", "M", "F", "M", "M", "F"];
df


Out[30]:

8 rows × 2 columns

AB
Int64String
11M
22F
33F
44M
55F
66M
77M
88F

In [31]:
nrows = size(df, 1) # nombre de ligne
ncols = size(df, 2) # nombre de colonne


Out[31]:
2

In [33]:
first(df)#Voir le début du tableau


Out[33]:

DataFrameRow

1 rows × 2 columns

AB
Int64String
11M

In [34]:
last(df) #Voir la fin du tableau


Out[34]:

DataFrameRow

1 rows × 2 columns

AB
Int64String
88F

In [35]:
df[1:3, :] #Voir les lignes 1,2,3 du tableau


Out[35]:

3 rows × 2 columns

AB
Int64String
11M
22F
33F

Nous avons l'analogie avec summarize du logiciel R :


In [36]:
describe(df)


Out[36]:

2 rows × 8 columns

variablemeanminmedianmaxnuniquenmissingeltype
SymbolUnion…AnyUnion…AnyUnion…NothingDataType
1A4.514.58Int64
2BFM2String

Pour aller plus loin dans le travail statistique sur les Dataframes il nous faut le package RDatasets qui va fournir nombres exemples et on va y retrouver beaucoup de fonctionnalités communes au logiciel R.

RDatasets


In [38]:
using RDatasets